import uuid
import time
from django.core.cache import cache

class RedisLock:
    def __init__(self, lock_key, timeout=10):
        """
        初始化 Redis 分布式锁
        :param lock_key: 锁的 key
        :param timeout: 锁的超时时间（秒）
        """
        self.lock_key = lock_key
        self.timeout = timeout
        self.lock_value = str(uuid.uuid4())  # 使用唯一的值标识锁

    def acquire(self):
        """
        尝试获取锁
        :return: 获取锁成功返回 True，否则返回 False
        """
        # 使用 Redis 的 SETNX 命令来获取锁并设置超时时间
        lock_set = cache.add(self.lock_key, self.lock_value, timeout=self.timeout)
        return lock_set

    def release(self):
        """
        释放锁
        :return: 释放锁成功返回 True，否则返回 False
        """
        # 使用 Lua 脚本确保只有持有锁的客户端才能释放锁
        script = """
        if redis.call("get", KEYS[1]) == ARGV[1] then
            return redis.call("del", KEYS[1])
        else
            return 0
        end
        """
        result = cache.client.get_client().eval(script, 1, self.lock_key, self.lock_value)
        return result == 1

    def is_locked(self):
        """
        判断锁是否被占用
        :return: 锁是否被占用
        """
        return cache.get(self.lock_key) is not None


# 使用示例
if __name__ == "__main__":
    lock = RedisLock("zeng_lock_key_test")

    # 尝试获取锁
    if lock.acquire():
        print("成功获取锁！")
        try:
            # 执行临界区操作
            print("正在执行临界区操作...")
            time.sleep(5)  # 模拟操作
        finally:
            # 释放锁
            if lock.release():
                print("成功释放锁！")
            else:
                print("释放锁失败！")
    else:
        print("无法获取锁，锁被其他进程占用！")
